昨天聊了 Gateway API Key 的額度跟權限設計。今天要聊的是這個系列最後一個功能模組:MCP Server。
MCP Server 讓 Claude Desktop、Claude Code 這類支援 MCP 的工具可以連上這個 Router,查詢當下有哪些 model 可用、用量跟花費狀況,甚至能請 agent 代為管理 Credential 跟 Deployment。用 stdio 傳輸,當一個本機 subprocess 跑。提供的工具分兩類:查詢類(列出 model、Deployment、Credential,看用量彙總、查請求明細)跟管理類(新增/調整 Credential 跟 Deployment、觸發健康檢查)。
第一步:啟動後端服務
npm run start
第二步:在 Claude Desktop(或 Claude Code)裡新增這個 MCP Server
打開 Claude Desktop 的設定檔(claude_desktop_config.json),在 mcpServers 底下加一筆,把 /path/to/router 換成這個專案實際的路徑:
{
"mcpServers": {
"personal-llm-router": {
"command": "node",
"args": ["--env-file=.env", "dist/mcp/server.js"],
"cwd": "/path/to/router"
}
}
}
第三步:重新啟動 Claude Desktop(或重新載入 Claude Code 的 MCP 設定)
讓它讀到剛剛新增的這筆設定。
第四步:直接開始問
例如:「這個 Router 現在有哪些 model 可以用?」「這個月花了多少錢?」——agent 會自動呼叫對應的工具,把答案帶回來,不用自己再開網頁查。
這個選擇是討論後才確定的,不是一開始就這樣想。
一開始確實考慮過另一個方案:讓 MCP Server 帶著 SITE_PASSWORD 真的打一次 /api/login,像瀏覽器登入一樣換一顆 cookie 回來用。但比較過後發現這個做法比較麻煩——MCP Server 要多知道前端的網址,還要處理 cookie 的快取、過期後要重新登入這些狀態管理,多了一層不必要的複雜度。
後來想通關鍵的一點:不管走哪個方案,MCP Server 本來就得讀得到跟後端共用的機密值——要嘛是 SITE_PASSWORD,要嘛是 SITE_SESSION_SECRET,兩者都是同一份 .env 裡的東西,信任成本完全一樣。既然如此,直接用 SITE_SESSION_SECRET 自己簽一顆合法的 session token,比多繞一次「登入換 cookie」的流程單純得多,也不會因為省了這道手續而少了什麼安全保障。
這其實也呼應了整個系列一路強調的原則:個人版不需要為了單一情境(這裡是 MCP)再多做一套獨立的驗證機制,複雜度該花在真正需要管理的地方(哪些 key 能做什麼、額度怎麼設),不是花在重複造一套本質相同的認證輪子。
在用 Claude 開發的過程中,一直讓 agent 代為操作測試,過程中會產生很多 API Key,有時候連自己都搞不清楚這些 key 是拿來做什麼的,數值也遺失掉了——與其讓這種情況繼續發生,不如乾脆禁止 agent 直接碰 API Key 管理這塊。MCP server 的功能定位,本來就是讓 agent 更好理解這個服務的內容、不用每次都走一遍登入流程才能拿到資訊,而不是要讓它連額度、權限這些管理性的東西都能自己動手。
MCP Server 讓這個系統不只是能被程式呼叫,還能被 AI agent 直接理解跟操作——查詢當下有哪些 model 可用、用量花費,甚至代為管理設定,不用另外去讀文件或記 REST API 的網址跟格式。驗證方式用跟後端共用的機密值自己簽 token,讓 agent 不用像瀏覽器一樣走一遍登入流程;額度、權限這類真正涉及金錢跟存取範圍的管理,則刻意留在 Web UI 手動操作,不開放給 MCP。
明天要聊 Code Review——怎麼系統性審查自己跟 AI 一起寫出來的系統。
如果大家看到這邊對這個專案有興趣,完整程式碼都已經整理並開源在 GitHub 上: